/**
* \file		Production.h
* \brief	Définit la structure Production
* \details	Définition de la structure Production et de ses fonctions associées
*/

#ifndef PRODUCTION_H
#define PRODUCTION_H
#include "Entrepot.h"
#include "ArbreTech.h"
#include <string.h>
#include <stdlib.h>


/**
 *\struct       Production
* \brief	Définition d'une Production.
* \details	Cette structure contient les informations sur l'état d'avancement d'une Production
*/
typedef struct
{
  char* nom; /*!<nom de la production, celui-ci doit être conforme à la liste des ressources stockées dans l'entrepot*/
  int pourcentageProd; /*!<pourcentage de completion de la production*/
  int vitesseProd; /*!<valeur de laquelle est incrémenté le pourcentage de production à chaque pas de temps*/
} Production;
/*================= Accesseurs/mutateurs sur la structure =================*/
/**
* \fn           void initProd(Production* prod)
* \brief        Créé une structure Production
* \details	Alloue de la mémoire à la Production et initialise ses valeurs avec initProd
* \param        prod     Pointeur sur le pointeur de la Production à initialiser
*/
void creerProd(Production** prod);
/**
* \fn           void initProd(Production* prod)
* \brief	Initialise le contenu d'une structure Production
* \details	Met à 0 tous les int et à NULL le pointeur sur la chaine de caractère du nom
* \param        prod     Pointeur sur la Production à initialiser
*/
void initProd(Production* prod);
/**
* \fn           void getNomProd(const Production* prod)
* \brief	Renvois le nom de la production
* \details	Renvois une chaine de caractère du nom de la Production
* \param        prod     Pointeur sur la Production dont on veut récuperer le nom
*/
char* getNomProd(const Production* prod);
/**
* \fn           void getPourcentageProd(const Production* prod)
* \brief	Renvois le pourcentage d'avancement de la Production
* \param        prod Pointeur sur la Production dont on veut récuperer le pourcentage de production
*/
int getPourcentageProd(const Production* prod);
/**
* \fn           void getVitesseProd(const Production* prod)
* \brief	Renvois la vitesse de la production
* \details	Renvois un int de la vitesse de production par pas d'incrementation
* \param        prod     Pointeur sur la Production dont on veut récuperer la vitesse de production
*/
int getVitesseProd(const Production* prod);
/**
* \fn           void setNomProd(const Production* prod, char* nouvNom)
* \brief	Affecte un nouveau nom à la production
* \details	Recupère une chaine de caractère pour l'attribuer au champ de nom de la 
*               structure Production après avoir vérifier qu'elle correspond à un nom de champs de l'entrepot
* \param        prod    Pointeur sur la Production dont on veut changer le nom
* \param        nouvNom Chaine de caractère du nouveau nom
*/
void setNomProd(Production* prod, char* nouvNom); /*char* non mis en const car le compilateur emet un warning du fait que l'on veut l'attribuer à un champ de la structure et donc qu'il sera peut être modifié*/
/**
* \fn           void ajouteVitesseProd(const Production* prod, int varVitesse)
* \brief	Affecte une nouvelle vitesse de production
* \details	Récupère une valeur entière positive ou négative pour l'ajouter à l'anciene vitesse de réalisation de la  production
* \param        prod     Pointeur sur la Production dont on veut changer le nom
* \param        varVitesseProd Valeur de la variation de la vitesse de production
*/
void ajouteVitesseProd(Production* prod, int varVitesseProd);
/**
* \fn           void ajoutePourcentageProd(const Production* prod, int varPourcentageProd)
* \brief	Affecte un nouveau pourcentage de production
* \details	Récupère une valeur entière positive ou négative pour l'ajouter à l'ancien pourcentage d'avancement de la  production
* \param        prod     Pointeur sur la Production dont on veut changer le nom
* \param        varVitesse Valeur de la variation de l'avancement de la production
*/
void ajoutePourcentageProd(Production* prod, int varPourcentageProd);

/**
* \fn           void libereProd
* \brief	Libère la mémoire allouée aux champs d'une production
* \details	Effectue les free pour une structure Production
*/
void libereProd(Production* prod);

/**
* \fn           void detruireProd
* \brief	Detruit une Production
* \details	Effectue les free pour une structure Production
*/
void detruireProd(Production* prod);

/*========= Incrementation de la production par pas de temps =========*/
/**
* \fn           void incrementeProd(Production* prod, Entrepot* entrepot)
* \brief	Incremente d'un pas de temps la production
* \details	Calcule la nouvelle valeur de pourcentage d'avancement de la production en fonction de la vitesse et du bonus technologique
*               et si la valeur de réalisation dépasse 100% la production est ajoutée dans l'entrepots dans une quantité dépendant du type de
*               production. Le pourcentage de réalisation est remis à 0 ou, si celui-ci était supérieur à 100, le surplus est peporté.
* \param        prod     Pointeur sur la Production dont on veut changer le nom
* \param        entrepot Pointeur sur l'entrepot dans lequel sera stockée la production finie
*/
void incrementeProd(Production* prod, Entrepot* entrepot);

#endif

/*============================== Fonction test ======================*/
/**
* \fn           void testProd()
* \brief	Teste les fonctions de la structure Production
* \details	Teste les accesseurs/mutateurs, l'incrementation et l'insertion de productions dans l'entrepot
*/
void testProd();
